package main

import (
	"crypto/tls"
	"crypto/x509"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	// 加载客户端证书和私钥
	cert, err := tls.LoadX509KeyPair("client.crt", "client.key")
	if err != nil {
		log.Fatalf("Error loading client cert and key: %v", err)
	}

	// 创建一个证书池并加载CA证书（如果需要验证服务器证书）
	caCertPool := x509.NewCertPool()
	caCert, err := ioutil.ReadFile("ca.crt") // ca.crt 是可选的，如果服务器证书是自签名的，并且你信任它
	if err != nil {
		log.Fatalf("Error reading CA certificate: %v", err)
	}
	caCertPool.AppendCertsFromPEM(caCert)

	// 配置TLS客户端
	tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert},        // 客户端证书和私钥
		ClientAuth:   tls.RequireAndVerifyClientCert, // 通常不需要在客户端设置这个，它是服务器设置的
		RootCAs:      caCertPool,                     // 可选的，用于验证服务器证书
		// InsecureSkipVerify: true, // 在生产环境中不要使用这个，它会使TLS失去安全性
	}

	// 创建带有TLS配置的HTTP传输层
	tr := &http.Transport{
		TLSClientConfig: tlsConfig,
	}

	// 创建HTTP客户端
	client := &http.Client{Transport: tr}

	// 发送GET请求
	req, err := http.NewRequest("GET", "https://127.0.0.1:8443/", nil)
	if err != nil {
		log.Fatal(err)
	}

	// 执行请求
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	// 读取响应体
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Fatal(err)
	}

	// 打印响应内容
	fmt.Println(string(body))
}
